/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controlador.Service.Produccion;

import Controlador.Bean.Produccion.DesempenoHistorico;
import Controlador.Bean.Produccion.ProductoF;
import Controlador.Bean.RRHH.*;
import java.util.ArrayList;
import java.util.Random;

/**
 *
 * @author j.d
 */
public class GestionAsignacion {
    
    public static final int ITERACIONES = 10000;
    public static double relajacion = 0.65;   
    private boolean SeAsignoTodo = false;   
    
   public ArrayList<DesempenoHistorico> ObtenerAsignacion(ArrayList<DesempenoHistorico> Eficiencias, ArrayList<ProductoF> Productos, ArrayList<Turno> Turnos){
       
        int iteracionesActuales = 0;
        ArrayList<DesempenoHistorico> AsignacionCandidata= new ArrayList(); //aca se va a almacenar la solucion parical
        ArrayList<DesempenoHistorico> AsignacionFinal= null; //aca se guarda la solucion final
        //Productos = OrdenarProductos(Productos, ordendeProduccion);
     
        
        while(iteracionesActuales < ITERACIONES){
            
            AsignacionCandidata = FaseDeConstruccion(Eficiencias,Productos,Turnos);
   
            if(AsignacionFinal == null){ //si es la primera iteración
                AsignacionFinal = AsignacionCandidata;
            }else{      //para las demas iteracioes comparamos
                if(HallaUtilidad(AsignacionCandidata) > HallaUtilidad(AsignacionFinal)) {
                    AsignacionFinal=AsignacionCandidata;
                }
            }
            ResetearAsignacion(Eficiencias);
            iteracionesActuales++;
     

        }
        
      // System.out.println("***************************");
       //  ImprimeSolucion(AsignacionFinal);
      
    //     System.out.print(HallaUtilidad(AsignacionFinal));
      // System.out.println("***************************");
        

        
       
       
       return null;
       
   }

    private ArrayList<DesempenoHistorico> FaseDeConstruccion(ArrayList<DesempenoHistorico> Eficiencias, ArrayList<ProductoF> Productos, ArrayList<Turno> Turnos) {
        ArrayList<DesempenoHistorico> Solucion = new ArrayList();
        ArrayList<DesempenoHistorico> ListaCandidatos = new ArrayList();
        ArrayList<DesempenoHistorico> Posibles = new ArrayList();
        DesempenoHistorico MejorOpcion;
        DesempenoHistorico PeorOpcion;
        DesempenoHistorico AsignacionEscogida;
        Random IndiceAleatorio = new Random();
        int IndiceEscogido;
        double MayorValor;
        double PeorValor;
        
        for(int i = 0; i<Turnos.size(); i++){
            for(int j = 0; j < Productos.size(); j++){
                //OrdenarFases(Productos,FacesDelProducto);
               // for(int k = 0; k<fases.size(); k++)
                //{
                while(true){
                    
             Posibles = EncontrarPosibles(Eficiencias);
             MejorOpcion = HallaMejorOpcion(Posibles); //Tambien se le debe pasar la fase
             PeorOpcion = HallaPeorOpcion(Posibles);//Tambien se le debe pasar la fase
             
             MayorValor = MejorOpcion.getValorFuncionObjetivo();
             PeorValor = PeorOpcion.getPeorValor(MayorValor,PeorOpcion.getValorFuncionObjetivo());
             ListaCandidatos = LlenarCandidatos(MayorValor,PeorValor,Posibles); //Tambien se le debe pasar la fase
               
             IndiceEscogido = IndiceAleatorio.nextInt(ListaCandidatos.size());
             AsignacionEscogida = ListaCandidatos.get(IndiceEscogido);
             
             Solucion.add(new DesempenoHistorico(AsignacionEscogida.getIdEmpleadoOp(),AsignacionEscogida.getIdMaquina(),Turnos.get(i).getIdturno(),AsignacionEscogida.getFecha(),AsignacionEscogida.getProduccion(),AsignacionEscogida.getPerdida(),true));
             //OJO: En vez de Idmaquina debe ser ID TIPO DE MAQUINA
             AsignacionEscogida.setAsignado(true);
                     
             //se debe poner como fin el plan de produccion diario
                }
                //}
            }
                                   
        }
            return null;
    }
    
    
    
        public double HallaUtilidad(ArrayList<DesempenoHistorico> Solucion){
        
       
        return 0;
        
        }

    private DesempenoHistorico HallaMejorOpcion(ArrayList<DesempenoHistorico> Eficiencias) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private DesempenoHistorico HallaPeorOpcion(ArrayList<DesempenoHistorico> Eficiencias) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private ArrayList<DesempenoHistorico> LlenarCandidatos(double MayorValor, double PeorValor, ArrayList<DesempenoHistorico> Eficiencias) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    
       private ArrayList<DesempenoHistorico> EncontrarPosibles(ArrayList<DesempenoHistorico> Eficiencias) {
        
        ArrayList<DesempenoHistorico> PosiblesTemporal = new ArrayList();
        
        for(int i = 0; i < Eficiencias.size(); i++){
            
            if(Eficiencias.get(i).isAsignado() == false){
                PosiblesTemporal.add(Eficiencias.get(i));
            }
        }
        
        return null;
        
        
    }

    private void ResetearAsignacion(ArrayList<DesempenoHistorico> Eficiencias) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    
}
